#pragma once
// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.

#include "BootstrapperEngineTypes.h"

#if defined(__cplusplus)
extern "C" {
#endif

const LPCWSTR BOOTSTRAPPER_APPLICATION_COMMANDLINE_SWITCH_API_VERSION = L"burn.ba.apiver";
const LPCWSTR BOOTSTRAPPER_APPLICATION_COMMANDLINE_SWITCH_PIPE_NAME = L"burn.ba.pipe";
const DWORD WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION = 5;

enum BOOTSTRAPPER_DISPLAY
{
    BOOTSTRAPPER_DISPLAY_UNKNOWN,
    BOOTSTRAPPER_DISPLAY_EMBEDDED,
    BOOTSTRAPPER_DISPLAY_NONE,
    BOOTSTRAPPER_DISPLAY_PASSIVE,
    BOOTSTRAPPER_DISPLAY_FULL,
};

enum BOOTSTRAPPER_REGISTRATION_TYPE
{
    BOOTSTRAPPER_REGISTRATION_TYPE_NONE, // The engine will ignore NONE if it recommended INPROGRESS or FULL.
    BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS,
    BOOTSTRAPPER_REGISTRATION_TYPE_FULL,
};

enum BOOTSTRAPPER_RESUME_TYPE
{
    BOOTSTRAPPER_RESUME_TYPE_NONE,
    BOOTSTRAPPER_RESUME_TYPE_INVALID,        // resume information is present but invalid
    BOOTSTRAPPER_RESUME_TYPE_INTERRUPTED,    // relaunched after an unexpected interruption
    BOOTSTRAPPER_RESUME_TYPE_REBOOT,         // relaunched after reboot
    BOOTSTRAPPER_RESUME_TYPE_SUSPEND,        // relaunched after suspend
    BOOTSTRAPPER_RESUME_TYPE_ARP,            // launched from ARP
};

enum BOOTSTRAPPER_ERROR_TYPE
{
    BOOTSTRAPPER_ERROR_TYPE_ELEVATE,            // error occurred trying to elevate.
    BOOTSTRAPPER_ERROR_TYPE_WINDOWS_INSTALLER,  // error came from windows installer.
    BOOTSTRAPPER_ERROR_TYPE_EXE_PACKAGE,        // error came from an exe package.
    BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_SERVER,   // error occurred trying to authenticate with HTTP server.
    BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_PROXY,    // error occurred trying to authenticate with HTTP proxy.
    BOOTSTRAPPER_ERROR_TYPE_APPLY,              // error occurred during apply.
};

enum BOOTSTRAPPER_FILES_IN_USE_TYPE
{
    BOOTSTRAPPER_FILES_IN_USE_TYPE_MSI,    // INSTALLMESSAGE_FILESINUSE
    BOOTSTRAPPER_FILES_IN_USE_TYPE_MSI_RM, // INSTALLMESSAGE_RMFILESINUSE
    BOOTSTRAPPER_FILES_IN_USE_TYPE_NETFX,  // MMIO_CLOSE_APPS
};

enum BOOTSTRAPPER_RELATED_OPERATION
{
    BOOTSTRAPPER_RELATED_OPERATION_NONE,
    BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE,
    BOOTSTRAPPER_RELATED_OPERATION_MINOR_UPDATE,
    BOOTSTRAPPER_RELATED_OPERATION_MAJOR_UPGRADE,
    BOOTSTRAPPER_RELATED_OPERATION_REMOVE,
    BOOTSTRAPPER_RELATED_OPERATION_INSTALL,
    BOOTSTRAPPER_RELATED_OPERATION_REPAIR,
};

enum BOOTSTRAPPER_CACHE_OPERATION
{
    // There is no source available.
    BOOTSTRAPPER_CACHE_OPERATION_NONE,
    // Copy the payload or container from the chosen local source.
    BOOTSTRAPPER_CACHE_OPERATION_COPY,
    // Download the payload or container using the download URL.
    BOOTSTRAPPER_CACHE_OPERATION_DOWNLOAD,
    // Extract the payload from the container.
    BOOTSTRAPPER_CACHE_OPERATION_EXTRACT,
};

enum BOOTSTRAPPER_CACHE_RESOLVE_OPERATION
{
    // There is no source available.
    BOOTSTRAPPER_CACHE_RESOLVE_NONE,
    // Copy the payload or container from the chosen local source.
    BOOTSTRAPPER_CACHE_RESOLVE_LOCAL,
    // Download the payload or container from the download URL.
    BOOTSTRAPPER_CACHE_RESOLVE_DOWNLOAD,
    // Extract the payload from the container.
    BOOTSTRAPPER_CACHE_RESOLVE_CONTAINER,
    // Look again for the payload or container locally.
    BOOTSTRAPPER_CACHE_RESOLVE_RETRY,
};

enum BOOTSTRAPPER_CACHE_VERIFY_STEP
{
    BOOTSTRAPPER_CACHE_VERIFY_STEP_STAGE,
    BOOTSTRAPPER_CACHE_VERIFY_STEP_HASH,
    BOOTSTRAPPER_CACHE_VERIFY_STEP_FINALIZE,
};

enum BOOTSTRAPPER_APPLY_RESTART
{
    BOOTSTRAPPER_APPLY_RESTART_NONE,
    BOOTSTRAPPER_APPLY_RESTART_REQUIRED,
    BOOTSTRAPPER_APPLY_RESTART_INITIATED,
};

enum BOOTSTRAPPER_RELATION_TYPE
{
    BOOTSTRAPPER_RELATION_NONE,
    BOOTSTRAPPER_RELATION_DETECT,
    BOOTSTRAPPER_RELATION_UPGRADE,
    BOOTSTRAPPER_RELATION_ADDON,
    BOOTSTRAPPER_RELATION_PATCH,
    BOOTSTRAPPER_RELATION_DEPENDENT_ADDON,
    BOOTSTRAPPER_RELATION_DEPENDENT_PATCH,
    BOOTSTRAPPER_RELATION_UPDATE,
    BOOTSTRAPPER_RELATION_CHAIN_PACKAGE,
};

enum BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE
{
    BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_NONE,
    BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DOWNGRADE,
    BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_UPGRADE,
    BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_ADDON,
    BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_PATCH,
    BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DEPENDENT_ADDON,
    BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DEPENDENT_PATCH,
};

enum BOOTSTRAPPER_CACHE_TYPE
{
    BOOTSTRAPPER_CACHE_TYPE_REMOVE,
    BOOTSTRAPPER_CACHE_TYPE_KEEP,
    BOOTSTRAPPER_CACHE_TYPE_FORCE,
};

enum BOOTSTRAPPER_PACKAGE_CONDITION_RESULT
{
    BOOTSTRAPPER_PACKAGE_CONDITION_DEFAULT,
    BOOTSTRAPPER_PACKAGE_CONDITION_FALSE,
    BOOTSTRAPPER_PACKAGE_CONDITION_TRUE,
};

enum BOOTSTRAPPER_MSI_FILE_VERSIONING
{
    BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER,          //o
    BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER_OR_EQUAL, //e
    BOOTSTRAPPER_MSI_FILE_VERSIONING_ALL,                       //a
};

enum BOOTSTRAPPER_APPLICATION_MESSAGE
{
    BOOTSTRAPPER_APPLICATION_MESSAGE_UNKNOWN = 65536,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCREATE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDESTROY,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONSTARTUP,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONSHUTDOWN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTFORWARDCOMPATIBLEBUNDLE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTMSIFEATURE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGEBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPATCHTARGET,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDBUNDLE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDMSIPACKAGE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATEBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIFEATURE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGEBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPATCHTARGET,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANRELATEDBUNDLE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATEBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPROGRESS,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONERROR,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGEBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREPROGRESS,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRERESOLVING,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGEBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPATCHTARGET,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPROGRESS,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEMSIMESSAGE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEFILESINUSE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDPACKAGE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANFORWARDCOMPATIBLEBUNDLE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYPROGRESS,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTCOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTPROGRESS,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANROLLBACKBOUNDARY,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANRESTORERELATEDBUNDLE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANRELATEDBUNDLETYPE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYDOWNGRADE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPROCESSCANCEL,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDBUNDLEPACKAGE,
    BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGENONVITALVALIDATIONFAILURE,
};

enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION
{
    BOOTSTRAPPER_APPLYCOMPLETE_ACTION_NONE,
    // Instructs the engine to restart.
    // The engine will not launch again after the machine is rebooted.
    // Ignored if reboot was already initiated by OnExecutePackageComplete().
    BOOTSTRAPPER_APPLYCOMPLETE_ACTION_RESTART,
};

enum BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION
{
    BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION_NONE,
    // Instructs the engine to try the acquisition of the payload again.
    // Ignored if hrStatus is a success.
    BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION_RETRY,
};

enum BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION
{
    BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE,
    // Instructs the engine to ignore non-vital package failures and
    // continue with the caching.
    // Ignored if hrStatus is a success or the package is vital.
    BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_IGNORE,
    // Instructs the engine to try the acquisition and verification of the package again.
    // Ignored if hrStatus is a success.
    BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_RETRY,
};

enum BOOTSTRAPPER_CACHEPACKAGENONVITALVALIDATIONFAILURE_ACTION
{
    BOOTSTRAPPER_CACHEPACKAGENONVITALVALIDATIONFAILURE_ACTION_NONE,
    // Instructs the engine to try to acquire the package so execution can use it.
    // Most of the time this is used for installing the package during rollback.
    BOOTSTRAPPER_CACHEPACKAGENONVITALVALIDATIONFAILURE_ACTION_ACQUIRE,
};

enum BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION
{
    BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_NONE,
    // Ignored if hrStatus is a success.
    BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_RETRYVERIFICATION,
    // Ignored if hrStatus is a success.
    BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_RETRYACQUISITION,
};

enum BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION
{
    BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_NONE,
    // Instructs the engine to ignore non-vital package failures and
    // continue with the install.
    // Ignored if hrStatus is a success or the package is vital.
    BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_IGNORE,
    // Instructs the engine to try the execution of the package again.
    // Ignored if hrStatus is a success.
    BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_RETRY,
    // Instructs the engine to stop processing the chain and restart.
    // The engine will launch again after the machine is restarted.
    BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_RESTART,
    // Instructs the engine to stop processing the chain and
    // suspend the current state.
    BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_SUSPEND,
};

enum BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION
{
    BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION_NONE,
    // Instructs the engine to stop processing the chain and restart.
    // The engine will launch again after the machine is restarted.
    BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION_RESTART,
};

enum BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION
{
    // Instructs the engine to stop waiting for the process to exit.
    // The package is immediately considered to have failed with ERROR_INSTALL_USEREXIT.
    // The engine will never rollback the package.
    BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION_ABANDON,
    // Instructs the engine to wait for the process to exit.
    // Once the process has exited, the package is considered to have failed with ERROR_INSTALL_USEREXIT.
    // This allows the engine to rollback the package if necessary.
    BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION_WAIT,
};

enum BOOTSTRAPPER_SHUTDOWN_ACTION
{
    BOOTSTRAPPER_SHUTDOWN_ACTION_NONE,
    // Instructs the engine to restart.
    // The engine will not launch again after the machine is rebooted.
    // Ignored if reboot was already initiated by OnExecutePackageComplete().
    BOOTSTRAPPER_SHUTDOWN_ACTION_RESTART,
    // Instructs the engine to unload the bootstrapper application and
    // restart the engine which will load the bootstrapper application again.
    // Typically used to switch from a native bootstrapper application to a managed one.
    BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER,
    // Opts out of the engine behavior of trying to uninstall itself
    // when no non-permanent packages are installed.
    BOOTSTRAPPER_SHUTDOWN_ACTION_SKIP_CLEANUP,
};

enum BURN_MSI_PROPERTY
{
    BURN_MSI_PROPERTY_NONE,     // no property added
    BURN_MSI_PROPERTY_INSTALL,  // add BURNMSIINSTALL=1
    BURN_MSI_PROPERTY_MODIFY,   // add BURNMSIMODIFY=1
    BURN_MSI_PROPERTY_REPAIR,   // add BURNMSIREPAIR=1
    BURN_MSI_PROPERTY_UNINSTALL,// add BURNMSIUNINSTALL=1
};

struct BOOTSTRAPPER_COMMAND
{
    DWORD cbSize;
    BOOTSTRAPPER_ACTION action;
    BOOTSTRAPPER_DISPLAY display;

    LPWSTR wzCommandLine;
    INT32 nCmdShow;

    BOOTSTRAPPER_RESUME_TYPE resumeType;
    HWND hwndSplashScreen;

    // If this was run from a related bundle, specifies the relation type
    BOOTSTRAPPER_RELATION_TYPE relationType;
    BOOL fPassthrough;

    LPWSTR wzLayoutDirectory;
    LPWSTR wzBootstrapperWorkingFolder;
    LPWSTR wzBootstrapperApplicationDataPath;
};

struct BA_ONAPPLYBEGIN_ARGS
{
    DWORD dwApiVersion;
    DWORD dwPhaseCount;
};

struct BA_ONAPPLYBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONAPPLYCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
    // Indicates whether any package required a reboot or initiated the reboot already.
    BOOTSTRAPPER_APPLY_RESTART restart;
    BOOTSTRAPPER_APPLYCOMPLETE_ACTION recommendation;
};

struct BA_ONAPPLYCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_APPLYCOMPLETE_ACTION action;
};

struct BA_ONAPPLYDOWNGRADE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrRecommended;
};

struct BA_ONAPPLYDOWNGRADE_RESULTS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
};

struct BA_ONBEGINMSITRANSACTIONBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzTransactionId;
};

struct BA_ONBEGINMSITRANSACTIONBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONBEGINMSITRANSACTIONCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzTransactionId;
    HRESULT hrStatus;
};

struct BA_ONBEGINMSITRANSACTIONCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONCACHEACQUIREBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageOrContainerId;
    LPCWSTR wzPayloadId;
    LPCWSTR wzSource;
    LPCWSTR wzDownloadUrl;
    LPCWSTR wzPayloadContainerId;
    BOOTSTRAPPER_CACHE_OPERATION recommendation;
};

struct BA_ONCACHEACQUIREBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOTSTRAPPER_CACHE_OPERATION action;
};

struct BA_ONCACHEACQUIRECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageOrContainerId;
    LPCWSTR wzPayloadId;
    HRESULT hrStatus;
    BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION recommendation;
};

struct BA_ONCACHEACQUIRECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION action;
};

struct BA_ONCACHEACQUIREPROGRESS_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageOrContainerId;
    LPCWSTR wzPayloadId;
    DWORD64 dw64Progress;
    DWORD64 dw64Total;
    DWORD dwOverallPercentage;
};

struct BA_ONCACHEACQUIREPROGRESS_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONCACHEACQUIRERESOLVING_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageOrContainerId;
    LPCWSTR wzPayloadId;
    LPCWSTR* rgSearchPaths;
    DWORD cSearchPaths;
    BOOL fFoundLocal;
    DWORD dwRecommendedSearchPath;
    LPCWSTR wzDownloadUrl;
    LPCWSTR wzPayloadContainerId;
    BOOTSTRAPPER_CACHE_RESOLVE_OPERATION recommendation;
};

struct BA_ONCACHEACQUIRERESOLVING_RESULTS
{
    DWORD dwApiVersion;
    DWORD dwChosenSearchPath;
    BOOTSTRAPPER_CACHE_RESOLVE_OPERATION action;
    BOOL fCancel;
};

struct BA_ONCACHEBEGIN_ARGS
{
    DWORD dwApiVersion;
};

struct BA_ONCACHEBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONCACHECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
};

struct BA_ONCACHECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageOrContainerId;
    LPCWSTR wzPayloadId;
};

struct BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageOrContainerId;
    LPCWSTR wzPayloadId;
    HRESULT hrStatus;
};

struct BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageOrContainerId;
    LPCWSTR wzPayloadId;
    DWORD64 dw64Progress;
    DWORD64 dw64Total;
    DWORD dwOverallPercentage;
};

struct BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONCACHEPACKAGEBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    DWORD cCachePayloads;
    DWORD64 dw64PackageCacheSize;
    // If caching a package is not vital, then acquisition will be skipped unless the BA opts in through OnCachePackageNonVitalValidationFailure.
    BOOL fVital;
};

struct BA_ONCACHEPACKAGEBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONCACHEPACKAGECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    HRESULT hrStatus;
    BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION recommendation;
};

struct BA_ONCACHEPACKAGECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION action;
};

struct BA_ONCACHEPACKAGENONVITALVALIDATIONFAILURE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    HRESULT hrStatus;
    BOOTSTRAPPER_CACHEPACKAGENONVITALVALIDATIONFAILURE_ACTION recommendation;
};

struct BA_ONCACHEPACKAGENONVITALVALIDATIONFAILURE_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_CACHEPACKAGENONVITALVALIDATIONFAILURE_ACTION action;
};

struct BA_ONCACHEPAYLOADEXTRACTBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzContainerId;
    LPCWSTR wzPayloadId;
};

struct BA_ONCACHEPAYLOADEXTRACTBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONCACHEPAYLOADEXTRACTCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzContainerId;
    LPCWSTR wzPayloadId;
    HRESULT hrStatus;
};

struct BA_ONCACHEPAYLOADEXTRACTCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONCACHEPAYLOADEXTRACTPROGRESS_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzContainerId;
    LPCWSTR wzPayloadId;
    DWORD64 dw64Progress;
    DWORD64 dw64Total;
    DWORD dwOverallPercentage;
};

struct BA_ONCACHEPAYLOADEXTRACTPROGRESS_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONCACHEVERIFYBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageOrContainerId;
    LPCWSTR wzPayloadId;
};

struct BA_ONCACHEVERIFYBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONCACHEVERIFYCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageOrContainerId;
    LPCWSTR wzPayloadId;
    HRESULT hrStatus;
    BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION recommendation;
};

struct BA_ONCACHEVERIFYCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION action;
};

struct BA_ONCACHEVERIFYPROGRESS_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageOrContainerId;
    LPCWSTR wzPayloadId;
    DWORD64 dw64Progress;
    DWORD64 dw64Total;
    DWORD dwOverallPercentage;
    BOOTSTRAPPER_CACHE_VERIFY_STEP verifyStep;
};

struct BA_ONCACHEVERIFYPROGRESS_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONCOMMITMSITRANSACTIONBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzTransactionId;
};

struct BA_ONCOMMITMSITRANSACTIONBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONCOMMITMSITRANSACTIONCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzTransactionId;
    HRESULT hrStatus;
    BOOTSTRAPPER_APPLY_RESTART restart;
    BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION recommendation;
};

struct BA_ONCOMMITMSITRANSACTIONCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION action;
};

struct BA_ONCREATE_ARGS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_COMMAND command;
};

struct BA_ONCREATE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONDESTROY_ARGS
{
    DWORD dwApiVersion;
    BOOL fReload;
};

struct BA_ONDESTROY_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONDETECTBEGIN_ARGS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_REGISTRATION_TYPE registrationType;
    DWORD cPackages;
    BOOL fCached;
};

struct BA_ONDETECTBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONDETECTCOMPATIBLEMSIPACKAGE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzCompatiblePackageId;
    LPCWSTR wzCompatiblePackageVersion;
};

struct BA_ONDETECTCOMPATIBLEMSIPACKAGE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONDETECTCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
    BOOL fEligibleForCleanup;
};

struct BA_ONDETECTCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONDETECTFORWARDCOMPATIBLEBUNDLE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzBundleCode;
    BOOTSTRAPPER_RELATION_TYPE relationType;
    LPCWSTR wzBundleTag;
    BOOL fPerMachine;
    LPCWSTR wzVersion;
    BOOL fMissingFromCache;
};

struct BA_ONDETECTFORWARDCOMPATIBLEBUNDLE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONDETECTMSIFEATURE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzFeatureId;
    BOOTSTRAPPER_FEATURE_STATE state;
};

struct BA_ONDETECTMSIFEATURE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONDETECTPACKAGEBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
};

struct BA_ONDETECTPACKAGEBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONDETECTPACKAGECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    HRESULT hrStatus;
    BOOTSTRAPPER_PACKAGE_STATE state;
    BOOL fCached;
};

struct BA_ONDETECTPACKAGECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONDETECTRELATEDBUNDLE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzBundleCode;
    BOOTSTRAPPER_RELATION_TYPE relationType;
    LPCWSTR wzBundleTag;
    BOOL fPerMachine;
    LPCWSTR wzVersion;
    BOOL fMissingFromCache;
};

struct BA_ONDETECTRELATEDBUNDLE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONDETECTRELATEDBUNDLEPACKAGE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzBundleCode;
    BOOTSTRAPPER_RELATION_TYPE relationType;
    BOOL fPerMachine;
    LPCWSTR wzVersion;
};

struct BA_ONDETECTRELATEDBUNDLEPACKAGE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONDETECTRELATEDMSIPACKAGE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzUpgradeCode;
    LPCWSTR wzProductCode;
    BOOL fPerMachine;
    LPCWSTR wzVersion;
    BOOTSTRAPPER_RELATED_OPERATION operation;
};

struct BA_ONDETECTRELATEDMSIPACKAGE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONDETECTPATCHTARGET_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzProductCode;
    BOOTSTRAPPER_PACKAGE_STATE patchState;
};

struct BA_ONDETECTPATCHTARGET_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONDETECTUPDATE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzUpdateLocation;
    DWORD64 dw64Size;
    LPCWSTR wzHash;
    BOOTSTRAPPER_UPDATE_HASH_TYPE hashAlgorithm;
    LPCWSTR wzVersion;
    LPCWSTR wzTitle;
    LPCWSTR wzSummary;
    LPCWSTR wzContentType;
    LPCWSTR wzContent;
};

struct BA_ONDETECTUPDATE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOL fStopProcessingUpdates;
};

struct BA_ONDETECTUPDATEBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzUpdateLocation;
};

struct BA_ONDETECTUPDATEBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOL fSkip;
};

struct BA_ONDETECTUPDATECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
};

struct BA_ONDETECTUPDATECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fIgnoreError;
};

struct BA_ONELEVATEBEGIN_ARGS
{
    DWORD dwApiVersion;
};

struct BA_ONELEVATEBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONELEVATECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
};

struct BA_ONELEVATECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONERROR_ARGS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_ERROR_TYPE errorType;
    LPCWSTR wzPackageId;
    DWORD dwCode;
    LPCWSTR wzError;
    DWORD dwUIHint;
    DWORD cData;
    LPCWSTR* rgwzData;
    INT32 nRecommendation;
};

struct BA_ONERROR_RESULTS
{
    DWORD dwApiVersion;
    INT32 nResult;
};

struct BA_ONEXECUTEBEGIN_ARGS
{
    DWORD dwApiVersion;
    DWORD cExecutingPackages;
};

struct BA_ONEXECUTEBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONEXECUTECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
};

struct BA_ONEXECUTECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONEXECUTEFILESINUSE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    DWORD cFiles;
    LPCWSTR* rgwzFiles;
    INT32 nRecommendation;
    BOOTSTRAPPER_FILES_IN_USE_TYPE source;
};

struct BA_ONEXECUTEFILESINUSE_RESULTS
{
    DWORD dwApiVersion;
    INT32 nResult;
};

struct BA_ONEXECUTEMSIMESSAGE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    INSTALLMESSAGE messageType;
    DWORD dwUIHint;
    LPCWSTR wzMessage;
    DWORD cData;
    LPCWSTR* rgwzData;
    INT32 nRecommendation;
};

struct BA_ONEXECUTEMSIMESSAGE_RESULTS
{
    DWORD dwApiVersion;
    INT32 nResult;
};

struct BA_ONEXECUTEPACKAGEBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    BOOL fExecute; // false means rollback.
    BOOTSTRAPPER_ACTION_STATE action;
    INSTALLUILEVEL uiLevel;
    BOOL fDisableExternalUiHandler;
};

struct BA_ONEXECUTEPACKAGEBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONEXECUTEPACKAGECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    HRESULT hrStatus;
    // Indicates whether this package requires a reboot or initiated the reboot already.
    BOOTSTRAPPER_APPLY_RESTART restart;
    BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION recommendation;
};

struct BA_ONEXECUTEPACKAGECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION action;
};

struct BA_ONEXECUTEPATCHTARGET_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzTargetProductCode;
};

struct BA_ONEXECUTEPATCHTARGET_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONEXECUTEPROCESSCANCEL_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    DWORD dwProcessId;
    BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION recommendation;
};

struct BA_ONEXECUTEPROCESSCANCEL_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION action;
};

struct BA_ONEXECUTEPROGRESS_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    DWORD dwProgressPercentage;
    DWORD dwOverallPercentage;
};

struct BA_ONEXECUTEPROGRESS_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONLAUNCHAPPROVEDEXEBEGIN_ARGS
{
    DWORD dwApiVersion;
};

struct BA_ONLAUNCHAPPROVEDEXEBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONLAUNCHAPPROVEDEXECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
    // Only valid if the operation succeeded.
    DWORD dwProcessId;
};

struct BA_ONLAUNCHAPPROVEDEXECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONPAUSEAUTOMATICUPDATESBEGIN_ARGS
{
    DWORD dwApiVersion;
};

struct BA_ONPAUSEAUTOMATICUPDATESBEGIN_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
};

struct BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONPLANBEGIN_ARGS
{
    DWORD dwApiVersion;
    DWORD cPackages;
};

struct BA_ONPLANBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzCompatiblePackageId;
    LPCWSTR wzCompatiblePackageVersion;
    BOOL fRecommendedRemove;
};

struct BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOL fRequestRemove;
};

struct BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzCompatiblePackageId;
    HRESULT hrStatus;
    BOOL fRequestedRemove;
};

struct BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONPLANCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
};

struct BA_ONPLANCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONPLANFORWARDCOMPATIBLEBUNDLE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzBundleCode;
    BOOTSTRAPPER_RELATION_TYPE relationType;
    LPCWSTR wzBundleTag;
    BOOL fPerMachine;
    LPCWSTR wzVersion;
    BOOL fRecommendedIgnoreBundle;
};

struct BA_ONPLANFORWARDCOMPATIBLEBUNDLE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOL fIgnoreBundle;
};

struct BA_ONPLANMSIFEATURE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzFeatureId;
    BOOTSTRAPPER_FEATURE_STATE recommendedState;
};

struct BA_ONPLANMSIFEATURE_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_FEATURE_STATE requestedState;
    BOOL fCancel;
};

struct BA_ONPLANMSIPACKAGE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    BOOL fExecute; // false means rollback.
    BOOTSTRAPPER_ACTION_STATE action;
    BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning;
};

struct BA_ONPLANMSIPACKAGE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BURN_MSI_PROPERTY actionMsiProperty;
    INSTALLUILEVEL uiLevel;
    BOOL fDisableExternalUiHandler;
    BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning;
};

struct BA_ONPLANNEDCOMPATIBLEPACKAGE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzCompatiblePackageId;
    BOOL fRemove;
};

struct BA_ONPLANNEDCOMPATIBLEPACKAGE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONPLANNEDPACKAGE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    BOOTSTRAPPER_ACTION_STATE execute;
    BOOTSTRAPPER_ACTION_STATE rollback;
    BOOL fPlannedCache;
    BOOL fPlannedUncache;
};

struct BA_ONPLANNEDPACKAGE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONPLANPACKAGEBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    BOOTSTRAPPER_PACKAGE_STATE state;
    BOOL fCached;
    BOOTSTRAPPER_PACKAGE_CONDITION_RESULT installCondition;
    BOOTSTRAPPER_REQUEST_STATE recommendedState;
    BOOTSTRAPPER_CACHE_TYPE recommendedCacheType;
    BOOTSTRAPPER_PACKAGE_CONDITION_RESULT repairCondition;
};

struct BA_ONPLANPACKAGEBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOTSTRAPPER_REQUEST_STATE requestedState;
    BOOTSTRAPPER_CACHE_TYPE requestedCacheType;
};

struct BA_ONPLANPACKAGECOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    HRESULT hrStatus;
    BOOTSTRAPPER_REQUEST_STATE requested;
};

struct BA_ONPLANPACKAGECOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONPLANRELATEDBUNDLE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzBundleCode;
    BOOTSTRAPPER_REQUEST_STATE recommendedState;
};

struct BA_ONPLANRELATEDBUNDLE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOTSTRAPPER_REQUEST_STATE requestedState;
};

struct BA_ONPLANRELATEDBUNDLETYPE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzBundleCode;
    BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE recommendedType;
};

struct BA_ONPLANRELATEDBUNDLETYPE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE requestedType;
};

struct BA_ONPLANRESTORERELATEDBUNDLE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzBundleCode;
    BOOTSTRAPPER_REQUEST_STATE recommendedState;
};

struct BA_ONPLANRESTORERELATEDBUNDLE_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOTSTRAPPER_REQUEST_STATE requestedState;
};

struct BA_ONPLANROLLBACKBOUNDARY_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzRollbackBoundaryId;
    BOOL fRecommendedTransaction;
};

struct BA_ONPLANROLLBACKBOUNDARY_RESULTS
{
    DWORD dwApiVersion;
    BOOL fTransaction;
    BOOL fCancel;
};

struct BA_ONPLANPATCHTARGET_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzPackageId;
    LPCWSTR wzProductCode;
    BOOTSTRAPPER_REQUEST_STATE recommendedState;
};

struct BA_ONPLANPATCHTARGET_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOTSTRAPPER_REQUEST_STATE requestedState;
};

struct BA_ONPROGRESS_ARGS
{
    DWORD dwApiVersion;
    DWORD dwProgressPercentage;
    DWORD dwOverallPercentage;
};

struct BA_ONPROGRESS_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
};

struct BA_ONREGISTERBEGIN_ARGS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_REGISTRATION_TYPE recommendedRegistrationType;
};

struct BA_ONREGISTERBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOL fCancel;
    BOOTSTRAPPER_REGISTRATION_TYPE registrationType;
};

struct BA_ONREGISTERCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
};

struct BA_ONREGISTERCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONROLLBACKMSITRANSACTIONBEGIN_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzTransactionId;
};

struct BA_ONROLLBACKMSITRANSACTIONBEGIN_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONROLLBACKMSITRANSACTIONCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    LPCWSTR wzTransactionId;
    HRESULT hrStatus;
    BOOTSTRAPPER_APPLY_RESTART restart;
    BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION recommendation;
};

struct BA_ONROLLBACKMSITRANSACTIONCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION action;
};

struct BA_ONSHUTDOWN_ARGS
{
    DWORD dwApiVersion;
};

struct BA_ONSHUTDOWN_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_SHUTDOWN_ACTION action;
};

struct BA_ONSTARTUP_ARGS
{
    DWORD dwApiVersion;
};

struct BA_ONSTARTUP_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONSYSTEMRESTOREPOINTBEGIN_ARGS
{
    DWORD dwApiVersion;
};

struct BA_ONSYSTEMRESTOREPOINTBEGIN_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONSYSTEMRESTOREPOINTCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
};

struct BA_ONSYSTEMRESTOREPOINTCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

struct BA_ONUNREGISTERBEGIN_ARGS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_REGISTRATION_TYPE recommendedRegistrationType;
};

struct BA_ONUNREGISTERBEGIN_RESULTS
{
    DWORD dwApiVersion;
    BOOTSTRAPPER_REGISTRATION_TYPE registrationType;
};

struct BA_ONUNREGISTERCOMPLETE_ARGS
{
    DWORD dwApiVersion;
    HRESULT hrStatus;
};

struct BA_ONUNREGISTERCOMPLETE_RESULTS
{
    DWORD dwApiVersion;
};

#if defined(__cplusplus)
}
#endif
